/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.cliente.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.citas.entidad.ControlCita;
import com.nys.conci.citas.servicio.ServicioControlCitas;
import com.nys.conci.cliente.entidad.Persona;
import com.nys.conci.cliente.entidad.PlanCliente;
import com.nys.conci.cliente.entidad.PlanPago;
import com.nys.conci.cliente.modelo.ModeloPlanCliente;
import com.nys.conci.cliente.modelo.ModeloPlanPago;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.jws.WebParam;

/**
 *
 * @author Yeudy10
 */
@ManagedBean
@ViewScoped
public class BeanPlanCliente extends BeanBase {

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioControlUsuario scu;
    @Inject
    private ServicioControlCitas scc;
    @Inject
    private ServicioAdministracion sa;
    private List<Persona> listado_persona_cliente;
    private List<PlanPago> listado_planes;
    private List<ModeloPlanPago> listado_planes_modelo;
    private List<ModeloPlanCliente> lista_plan_cliente;
    private ModeloPlanCliente modelo_tabla;
    private ModeloPlanCliente modelo_select;
    private Persona persona_cliente_tabla;
    private Persona persona_cliente_select;
    private ModeloPlanPago plan_select;
    private ModeloPlanPago plan_tabla;
    private String identificacion_c;
    private String dscCliente;
    private String dscPlanPago;
    private PlanCliente planC;
    private Integer id_plan;
    private boolean modificar;
    private boolean habilitar;
    private boolean ocultar;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanPlanCliente() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            modelo_tabla = new ModeloPlanCliente();
            setPlan_tabla(new ModeloPlanPago());
            persona_cliente_tabla = new Persona();
            
            ocultar = false;
            habilitar = false;
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        cargarClientes();
        cargarPlanes();
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    public void cargarClientes() {
        try {
            listado_persona_cliente = new ArrayList<Persona>();
            listado_persona_cliente = scu.consultarPersonas("C");
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void cargarPlanes() {
        try {
            listado_planes_modelo = new ArrayList<ModeloPlanPago>();
            listado_planes = new ArrayList<PlanPago>();
            listado_planes = sa.consultarListaPlanesPago();
            for (PlanPago planPago : listado_planes) {
                ModeloPlanPago plan = new ModeloPlanPago();
               plan.setDescripcion(planPago.getDescripcion());
               plan.setDuracion(planPago.getDuracion());
               plan.setId_especialidad(planPago.getId_especialidad());
               plan.setId_plan_pago(planPago.getId_plan_pago());               
               plan.setNombre(planPago.getNombre());
               plan.setNombre_especialidad(sa.consultarEspecialidad(planPago.getId_especialidad()).getNombre());
               plan.setPago_incial(planPago.getPago_inicial());
               plan.setPago_mensual(planPago.getPago_mensual());
               plan.setPago_total(planPago.getPago_total());
                listado_planes_modelo.add(plan);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void cargarPlanesCliente() {
        try {
            lista_plan_cliente = new ArrayList<ModeloPlanCliente>();
            List<PlanCliente> lista = new ArrayList<PlanCliente>();
            lista = scc.consultarListaPlanCienteId(identificacion_c);
            for (PlanCliente planCliente : lista) {
                ModeloPlanCliente modelo = new ModeloPlanCliente();
                modelo.setEstado(planCliente.getEstado());
                modelo.setId_plan_cliente(planCliente.getId_plan_cliente());
                modelo.setId_plan_pago(planCliente.getId_plan_pago());
                modelo.setIdentificacion_c(planCliente.getIdentificacion_c());
                modelo.setNombre_plan(sa.consultarPlanPago(planCliente.getId_plan_pago()).getNombre());
                Persona per_c = scu.consultarPersona(planCliente.getIdentificacion_c());
                if (per_c != null) {
                    modelo.setNombre_cliente(per_c.getNombre() + " " + per_c.getApellido1() + " " + per_c.getApellido2());
                }

                lista_plan_cliente.add(modelo);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void guardarPlanCliente() {
        try {
            if (validarPlanCliente()) {
                if (modificar) {
                    obtenerDatosPlanCLiente();
                    sa.guardarPlanCliente(modelo_select.toPlanCliente(), modificar);
                } else {
                    planC = new PlanCliente();
                    modelo_select = new ModeloPlanCliente();
                    planC = obtenerDatosPlanCLiente().toPlanCliente();
                    sa.guardarPlanCliente(planC, modificar);
                }
                String mensaje = "Se guardo correctamente el plan cliente";
                MensajeUtil.agregarMensajeInfo(mensaje);


                cargarPlanesCliente();
                limpiarPlanCliente();

            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public boolean validarPlanCliente() {
        boolean resultado = true;
        try {
            if (identificacion_c == null || identificacion_c.trim().equals("")) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Cliente");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_cliente", mensaje);
                resultado = false;
            }

            if (id_plan == null || id_plan == 0) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Plan Pago");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_estado", mensaje);
                resultado = false;
            }
            if (id_plan != null && identificacion_c != null) {
                PlanCliente pc = sa.consultarPlanCliente(id_plan, identificacion_c);
                if (pc != null) {
                    String mensaje = "No se puede agregar el mismo plan a un cliente";
                    MensajeUtil.agregarMensajeAdvertencia(mensaje);
                    resultado = false;
                }
            }

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return resultado;
    }

    public void eliminarPlanCliente() {
        try {
            List<ControlCita> cc = new ArrayList<ControlCita>();
            cc = scc.consultarPlanUsado(modelo_select.getId_plan_cliente());
            if (cc == null || cc.isEmpty()) {
                sa.eliminar(modelo_select.toPlanCliente());
                modelo_select = new ModeloPlanCliente();
                modelo_tabla = new ModeloPlanCliente();
                planC = new PlanCliente();
                modificar = false;
                habilitar = false;
                dscPlanPago = null;
                id_plan= null;
                identificacion_c = null;
                dscCliente= null;
                cargarPlanesCliente();                
                String mensaje = "El plan cliente seleccionado fue eliminado";
                MensajeUtil.agregarMensajeInfo(mensaje);
            } else {
                String mensaje = "No se pueden eliminar planes utilizados en citas";
                MensajeUtil.agregarMensajeAdvertencia(mensaje);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void limpiarPlanCliente() {
        try {
            modificar = false;
            habilitar = false;
            ocultar = false;
            identificacion_c = "";
            dscCliente=null;
            dscPlanPago=null;            
            id_plan = null;
            persona_cliente_select = new Persona();
            persona_cliente_tabla = new Persona();
            plan_select = new ModeloPlanPago();
            plan_tabla = new ModeloPlanPago();
            modelo_select = new ModeloPlanCliente();
            modelo_tabla = new ModeloPlanCliente();
                    
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void seleccionarCliente() {
        try {
            persona_cliente_select = persona_cliente_tabla;
            identificacion_c = persona_cliente_select.getIdentificacion();
            dscCliente = persona_cliente_select.getNombre() + " " + persona_cliente_select.getApellido1() + " " + persona_cliente_select.getApellido2();
            persona_cliente_select = new Persona();
            persona_cliente_tabla= new Persona();
            cargarPlanesCliente();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void seleccionarPlanPago() {
        try {
           plan_select = plan_tabla;
           id_plan = getPlan_select().getId_plan_pago();
           dscPlanPago = getPlan_select().getNombre();
           plan_select= new ModeloPlanPago();
           plan_tabla = new ModeloPlanPago();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void seleccionarPlanCliente() {
        try {
            modelo_select = modelo_tabla;
            identificacion_c = modelo_select.getIdentificacion_c();
            id_plan = modelo_select.getId_plan_pago();
            dscCliente = modelo_select.getNombre_cliente();
            dscPlanPago = modelo_select.getNombre_plan();                        
            modificar = true;
            
            List<ControlCita> cc = new ArrayList<ControlCita>();
            cc = scc.consultarPlanUsado(modelo_select.getId_plan_cliente());
            if (cc != null && !cc.isEmpty()) {
                habilitar = true;
                String mensaje = "No se pueden modificar un plan de un cliente que este asignado";
                MensajeUtil.agregarMensajeAdvertencia(mensaje);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void asignarDatosCita() {
        try {
            identificacion_c = getModelo_select().getIdentificacion_c();
            id_plan = getModelo_select().getId_plan_pago();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public ModeloPlanCliente obtenerDatosPlanCLiente() {
        try {

            getModelo_select().setId_plan_pago(id_plan);
            getModelo_select().setIdentificacion_c(identificacion_c);
            modelo_select.setNombre_plan(sa.consultarPlanPago(id_plan).getNombre());
            Persona p_c = scu.consultarPersona(identificacion_c);
            if (p_c != null) {
                getModelo_select().setNombre_cliente(p_c.getNombre() + " " + p_c.getApellido1() + " " + p_c.getApellido2());
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return getModelo_select();
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the listado_persona_cliente
     */
    public List<Persona> getListado_persona_cliente() {
        return listado_persona_cliente;
    }

    /**
     * @param listado_persona_cliente the listado_persona_cliente to set
     */
    public void setListado_persona_cliente(List<Persona> listado_persona_cliente) {
        this.listado_persona_cliente = listado_persona_cliente;
    }

    /**
     * @return the listado_planes
     */
    public List<PlanPago> getListado_planes() {
        return listado_planes;
    }

    /**
     * @param listado_planes the listado_planes to set
     */
    public void setListado_planes(List<PlanPago> listado_planes) {
        this.listado_planes = listado_planes;
    }

    /**
     * @return the identificacion_c
     */
    public String getIdentificacion_c() {
        return identificacion_c;
    }

    /**
     * @param identificacion_c the identificacion_c to set
     */
    public void setIdentificacion_c(String identificacion_c) {
        this.identificacion_c = identificacion_c;
    }

    /**
     * @return the id_plan
     */
    public Integer getId_plan() {
        return id_plan;
    }

    /**
     * @param id_plan the id_plan to set
     */
    public void setId_plan(Integer id_plan) {
        this.id_plan = id_plan;
    }

    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the habilitar
     */
    public boolean isHabilitar() {
        return habilitar;
    }

    /**
     * @param habilitar the habilitar to set
     */
    public void setHabilitar(boolean habilitar) {
        this.habilitar = habilitar;
    }

    /**
     * @return the persona_cliente_tabla
     */
    public Persona getPersona_cliente_tabla() {
        return persona_cliente_tabla;
    }

    /**
     * @param persona_cliente_tabla the persona_cliente_tabla to set
     */
    public void setPersona_cliente_tabla(Persona persona_cliente_tabla) {
        this.persona_cliente_tabla = persona_cliente_tabla;
    }

    /**
     * @return the persona_cliente_select
     */
    public Persona getPersona_cliente_select() {
        return persona_cliente_select;
    }

    /**
     * @param persona_cliente_select the persona_cliente_select to set
     */
    public void setPersona_cliente_select(Persona persona_cliente_select) {
        this.persona_cliente_select = persona_cliente_select;
    }

    /**
     * @return the ocultar
     */
    public boolean isOcultar() {
        return ocultar;
    }

    /**
     * @param ocultar the ocultar to set
     */
    public void setOcultar(boolean ocultar) {
        this.ocultar = ocultar;
    }

    /**
     * @return the lista_plan_cliente
     */
    public List<ModeloPlanCliente> getLista_plan_cliente() {
        return lista_plan_cliente;
    }

    /**
     * @param lista_plan_cliente the lista_plan_cliente to set
     */
    public void setLista_plan_cliente(List<ModeloPlanCliente> lista_plan_cliente) {
        this.lista_plan_cliente = lista_plan_cliente;
    }

    /**
     * @return the modelo_tabla
     */
    public ModeloPlanCliente getModelo_tabla() {
        return modelo_tabla;
    }

    /**
     * @param modelo_tabla the modelo_tabla to set
     */
    public void setModelo_tabla(ModeloPlanCliente modelo_tabla) {
        this.modelo_tabla = modelo_tabla;
    }

    /**
     * @return the modelo_select
     */
    public ModeloPlanCliente getModelo_select() {
        return modelo_select;
    }

    /**
     * @param modelo_select the modelo_select to set
     */
    public void setModelo_select(ModeloPlanCliente modelo_select) {
        this.modelo_select = modelo_select;
    }

    /**
     * @return the planC
     */
    public PlanCliente getPlanC() {
        return planC;
    }

    /**
     * @param planC the planC to set
     */
    public void setPlanC(PlanCliente planC) {
        this.planC = planC;
    }

    /**
     * @return the dscCliente
     */
    public String getDscCliente() {
        return dscCliente;
    }

    /**
     * @param dscCliente the dscCliente to set
     */
    public void setDscCliente(String dscCliente) {
        this.dscCliente = dscCliente;
    }

    /**
     * @return the dscPlanPago
     */
    public String getDscPlanPago() {
        return dscPlanPago;
    }

    /**
     * @param dscPlanPago the dscPlanPago to set
     */
    public void setDscPlanPago(String dscPlanPago) {
        this.dscPlanPago = dscPlanPago;
    }

    /**
     * @return the listado_planes_modelo
     */
    public List<ModeloPlanPago> getListado_planes_modelo() {
        return listado_planes_modelo;
    }

    /**
     * @param listado_planes_modelo the listado_planes_modelo to set
     */
    public void setListado_planes_modelo(List<ModeloPlanPago> listado_planes_modelo) {
        this.listado_planes_modelo = listado_planes_modelo;
    }

    /**
     * @return the plan_select
     */
    public ModeloPlanPago getPlan_select() {
        return plan_select;
    }

    /**
     * @param plan_select the plan_select to set
     */
    public void setPlan_select(ModeloPlanPago plan_select) {
        this.plan_select = plan_select;
    }

    /**
     * @return the plan_tabla
     */
    public ModeloPlanPago getPlan_tabla() {
        return plan_tabla;
    }

    /**
     * @param plan_tabla the plan_tabla to set
     */
    public void setPlan_tabla(ModeloPlanPago plan_tabla) {
        this.plan_tabla = plan_tabla;
    }
}
